home *** CD-ROM | disk | FTP | other *** search
- /* Title: -> c.win
- * Purpose: central control of window sytem events.
- *
- */
-
- #define BOOL int
- #define TRUE 1
- #define FALSE 0
-
- #include <stdarg.h>
- #include <stdlib.h>
- #include <string.h>
-
- #include "trace.h"
- #include "os.h"
- #include "wimp.h"
- #include "werr.h"
- #include "wimpt.h"
- #include "event.h"
- #include "msgs.h"
-
- #include "win.h"
-
- /* -------- Keeping Track of All Windows. -------- */
-
- typedef struct {
- wimp_w w;
- win_event_handler proc;
- void *handle;
- void *menuh;
- } win__str;
-
- #define MAXWINDOWS 65
- #define DUD (-1)
-
- static win__str win__allwindows[MAXWINDOWS];
- static int win__lim = 0; /* first unused index of win__allwindows */
-
- void win__register(wimp_w w, win_event_handler proc, void *handle)
- {
- int i;
- for (i=0;; i++) {
- if (i == MAXWINDOWS) {
- werr(1, msgs_lookup("win1:Too many windows.\n"));
- };
- if (i == win__lim) {win__lim++; break;};
- if (win__allwindows[i].w == w) {break;};
- if (win__allwindows[i].w == DUD) {break;};
- }
- win__allwindows[i].w = w;
- win__allwindows[i].proc = proc;
- win__allwindows[i].handle = handle;
- win__allwindows[i].menuh = 0;
- }
-
- void win__discard(wimp_w w)
- {
- int i;
- for (i=0; i<win__lim; i++) {
- if (win__allwindows[i].w == w) {
- win__allwindows[i].w = DUD;
- break;
- };
- }
- while (win__lim > 0 && win__allwindows[win__lim-1].w == DUD) {
- /* decrease the limit if you can. */
- win__lim--;
- };
- }
-
- win__str *win__find(wimp_w w)
- {
- int i;
- for (i=0; i<win__lim; i++) {
- if (win__allwindows[i].w == w) {
- return(&win__allwindows[i]);
- };
- };
- return(0);
- }
-
- /* -------- Claiming Events. -------- */
-
- void win_register_event_handler(
- wimp_w w, win_event_handler proc, void *handle)
- {
- if (proc == 0) {
- win__discard(w);
- } else {
- win__register(w, proc, handle);
- };
- }
-
- typedef struct unknown_previewer
- {
- struct unknown_previewer *link ;
- win_unknown_event_processor proc ;
- void *handle ;
- } unknown_previewer ;
-
- static wimp_w win__idle = DUD;
- #define win__unknown_flag (('U'<<24)+('N'<<16)+('K'<<8)+'N')
-
- static wimp_w win__unknown = DUD;
- static unknown_previewer *win__unknown_previewer_list = 0 ;
-
- void win_claim_idle_events(wimp_w w)
- {
- tracef1("idle events -> %d\n",w) ;
- win__idle = w;
- }
-
- wimp_w win_idle_event_claimer(void)
- {
- return(win__idle);
- }
-
- void win_claim_unknown_events(wimp_w w)
- {
- win__unknown = w;
- }
-
- wimp_w win_unknown_event_claimer(void)
- {
- return win__unknown;
- }
-
- void win_add_unknown_event_processor(win_unknown_event_processor p,
- void *h)
- {
- unknown_previewer *block = malloc(sizeof(unknown_previewer)) ;
- if (block != 0)
- {
- block->link = win__unknown_previewer_list ;
- block->proc = p ;
- block->handle = h ;
- win__unknown_previewer_list = block ;
- }
- }
-
- void win_remove_unknown_event_processor(win_unknown_event_processor p,
- void *h)
- {
- unknown_previewer *block ;
- for (block = (unknown_previewer *) &win__unknown_previewer_list ;
- block != 0 && block->link->proc != p && block->link->handle != h ;
- block = block->link) ;
- if (block != 0)
- {
- unknown_previewer *b2 = block->link ;
- block->link = b2->link ;
- free(b2) ;
- }
- }
-
- /* -------- Menus. -------- */
-
- void win_setmenuh(wimp_w w, void *handle)
- {
- win__str *p = win__find(w);
- if (p != 0) {p->menuh = handle;};
- }
-
- void *win_getmenuh(wimp_w w) /* 0 if not set */
- {
- win__str *p = win__find(w);
- return(p==0 ? 0 : p->menuh);
- }
-
- /* -------- Processing Events. -------- */
-
- BOOL win_processevent(wimp_eventstr *e)
- {
- wimp_w w;
- win__str *p;
- tracef1("win_processevent %i.\n", e->e);
- switch (e->e) {
- case wimp_ENULL:
- w = win__idle;
- break;
- case wimp_EUSERDRAG:
- w = win__unknown_flag ;
- break;
- case wimp_EREDRAW:
- {
- BOOL redraw;
- wimp_redrawstr redraw_box;
-
- redraw_box.w = e->data.o.w;
- wimpt_noerr (wimp_redraw_wind (&redraw_box, &redraw));
-
- while (redraw)
- {
- wimpt_complain (wimp_borderwindow (redraw_box));
- wimp_get_rectangle (&redraw_box, &redraw);
- }
- }
- w = e->data.o.w;
- break;
- case wimp_ECLOSE: case wimp_EOPEN:
- case wimp_EPTRLEAVE: case wimp_EPTRENTER: case wimp_EKEY:
- case wimp_ESCROLL:
- w = e->data.o.w;
- break;
- case wimp_EBUT:
- w = e->data.but.m.w;
- if (w <= (wimp_w) -1) w = win_ICONBAR;
- break;
- case wimp_ESEND:
- case wimp_ESENDWANTACK:
- switch (e->data.msg.hdr.action) {
- case wimp_MCLOSEDOWN:
- tracef0("closedown message\n");
- exit(0);
- case wimp_MDATALOAD:
- case wimp_MDATASAVE:
- tracef1("data %s message arriving.\n",
- (int) (e->data.msg.hdr.action==wimp_MDATASAVE ? "save" : "load"));
- if (e->data.msg.data.dataload.w < 0)
- {
- tracef0("data message to the icon bar.\n");
- w = win_ICONBARLOAD ;
- } else {
- w = e->data.msg.data.dataload.w;
- };
- break;
- case wimp_MHELPREQUEST:
- tracef1("help request for window %i.\n", e->data.msg.data.helprequest.m.w);
- w = e->data.msg.data.helprequest.m.w;
- if (w < 0) w = win_ICONBARLOAD;
- break;
- default:
- tracef1("unknown message type %i arriving.\n", e->data.msg.hdr.action);
- w = win__unknown_flag;
- if (w < 0) w = win_ICONBARLOAD;
- };
- break;
- default:
- w = win__unknown_flag;
- };
-
- if (w==win__unknown_flag || win__find(w) == 0)
- {
- unknown_previewer *pr ;
- for (pr = win__unknown_previewer_list; pr != 0; pr = pr->link)
- {
- if (pr->proc(e, pr->handle)) return TRUE ;
- }
- w = win__unknown ;
- }
-
- p = (w == DUD ? 0 : win__find(w));
- if (p != 0) {
- p->proc(e, p->handle);
- return TRUE;
- } else {
- return FALSE;
- };
- }
-
- /* -------- Termination. -------- */
-
- static int win__active = 0;
-
- void win_activeinc(void)
- {
- win__active++;
- }
-
- void win_activedec(void)
- {
- win__active--;
- }
-
- int win_activeno(void)
- {
- return win__active;
- }
-
- /* -------- Giving away the caret. -------- */
-
- void win_give_away_caret(void)
- {
- int i;
- for (i=0; i<win__lim; i++) {
- if (win__allwindows[i].w != DUD) { /* found a window */
- wimp_wstate s;
- wimp_eventstr e;
- tracef1("get state of window %i.", win__allwindows[i].w);
- (void) wimp_get_wind_state(win__allwindows[i].w, &s);
- tracef2("behind=%i flags=%i.\n", s.o.behind, s.flags);
- if (s.o.behind == DUD && (s.flags & wimp_WOPEN) != 0) {
- /* w is the top window */
- /* if it wants the caret, it will grab it. */
- tracef0("Opening it.\n");
- e.e = wimp_EOPEN;
- e.data.o = s.o;
- wimpt_fake_event(&e);
- break;
- };
- };
- };
- }
-
- /* ----------- setting a window title ------------ */
-
- void win_settitle(wimp_w w, char *newtitle)
- {
- wimp_redrawstr r;
- wimp_winfo *winfo;
-
- if((winfo = malloc(sizeof(wimp_wind) + 200*sizeof(wimp_icon))) == 0)
- werr(TRUE, msgs_lookup("win2:Not enough memory to change window title -- increase wimpslot"));
-
- tracef1("New title is %s\n", (int)newtitle);
- /* --- get the window's details --- */
- winfo->w = w;
- wimpt_noerr(wimp_get_wind_info(winfo));
-
- /* --- put the new title string in the title icon's buffer --- */
- tracef1("Lib buffer is at %d\n", (int)winfo->info.title.indirecttext.buffer);
- strcpy(winfo->info.title.indirecttext.buffer, newtitle);
-
- /* --- invalidate the title bar in absolute coords --- */
- r.w = (wimp_w) -1; /* absolute screen coords */
- r.box = winfo->info.box;
- r.box.y1 += 36; /* yuk - tweaky */
- r.box.y0 = r.box.y1 - 36;
- wimpt_noerr(wimp_force_redraw(&r));
-
- /* --- free space used to window info --- */
- free(winfo);
- }
-
- /* end */
-